package com.appl.cacciaaltesoro;

import java.util.ArrayList;

import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;

public class Caccia {
	public String title;
	public ArrayList<Tappa> percorso;
	public Tappa stato;
	public long startTime;
	public long lastTappaStartTime=0;
	public double punteggio;
	public double punteggioTappa;
	public boolean primaPosizioneTrovata=false;
	public boolean aiutoDirezione=false;
	public boolean aiutoDistanza=false;
	public boolean aiutoIndizio=false;
	public boolean aiutoImmagine=false;
	public boolean aiutoTime=false;
	public Long remTime;
	public boolean scaduto=false;
	
	public void setCacciadiprova() {
		primaPosizioneTrovata=false;
		title="Caccia al tesoro prova";
		percorso=new ArrayList<Tappa>();
		Tappa t1=new Tappa(0,"Fuori al Pozzo","Vai Fuori al Pozzo","E' all'incrocio di 4 strade",null,null,40.7626,14.0260,100,1000);
		percorso.add(t1);
//		t1.addAiuto("E' all'incrocio di 4 strade");
//		t1.addAiuto("E' vicino ad un Ufficio Postale e ad una banca");
		Tappa t2=new Tappa(1,"Marina Grande","Vai alla Chiesa della Marina Grande","E' nella zona del porto",t1,null,40.7655,14.0300,200,1000);		
		percorso.add(t2);
//		t2.addAiuto("E' nella zona del porto");
		Tappa t3=new Tappa(2,"Mamozio","Vai al Mamozio","E' in una grande rotatoria",t2,null,40.7605,14.0230,300,1500);
		percorso.add(t3);
	}
	public boolean nextState(boolean ok){		
		long ora=System.currentTimeMillis();
		if (stato.num>0)			
			stato.tempo=ora-lastTappaStartTime;
			//return (stato.tempo-percorso.get(stato.num-1).tempo);
		else 
			stato.tempo=ora-startTime;
		lastTappaStartTime=ora;

		if (ok)
			updatePunteggio(lastTappaStartTime);
		if (stato.num<percorso.size()-1)
		{						
			
			//nuova tappa
			stato=percorso.get((stato.num)+1);
			punteggioTappa=stato.punteggioBase;
			remTime=stato.tempoPar;
			aiutoDirezione=false;
			aiutoIndizio=false;
			aiutoImmagine=false;
			aiutoDistanza=false;
			aiutoTime=false;
			scaduto=false;
			return false;
		}
		else
			return true;
	}	
	
	public long calcolaTempoTappa(){				
		return percorso.get(stato.num-1).tempo;
	}

	public long calcolaTempoParziale(){
		long ora=System.currentTimeMillis();
		if (stato.num>0)
			return (ora-lastTappaStartTime);			
		else 
			return (ora-startTime);
	}

	public long calcolaTempoCaccia(){
		return lastTappaStartTime-startTime;
		//return stato.tempo-startTime;
	}
		
	
	public void start() {
		startTime = System.currentTimeMillis();
		stato=percorso.get(0);
		punteggio=0;
		punteggioTappa=stato.punteggioBase;
		remTime=stato.tempoPar;
		aiutoDirezione=false;
		aiutoIndizio=false;
		aiutoDistanza=false;
		aiutoImmagine=false;
		aiutoTime=false;
		scaduto=false;
	}
	
	public String getIndizio() {
		String s=new String();
		s=stato.aiuto;
		if (!aiutoIndizio){
			aiutoIndizio=true;
			punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
		}		
		return s;
//		String s=new String();
//		if (stato.aiuto.size()>0 && stato.indiceAiuto<stato.aiuto.size()){
//			s=stato.aiuto.get(stato.indiceAiuto);
//			stato.indiceAiuto++;
//			punteggioTappa=punteggioTappa-stato.punteggioBase*0.2;
//		}
//		else
//			s="no";
//		return s;
	}
	public void setPunteggio(double dist) {
		punteggioTappa=punteggioTappa+dist/10;
		return;
	}
	public void updatePunteggio(long tempo) {
		punteggio+=punteggioTappa;
		//TODO Mettere dipendenza da tempo
		return;
	}
	public void salvaStato(Editor editor) {
		editor.putBoolean("resume", true);
		editor.putLong("startTime", startTime);
		editor.putLong("lastTappaStartTime",lastTappaStartTime);
		editor.putFloat("punteggio", (float) punteggio);
		editor.putFloat("punteggioTappa", (float) punteggioTappa);
		editor.putInt("numTappa", stato.num);
		editor.putInt("indiceAiutoTappa", stato.indiceAiuto);
		editor.putBoolean("aiutoDirezione", aiutoDirezione);
		editor.putBoolean("aiutoDistanza", aiutoDistanza);
		editor.putBoolean("aiutoIndizio", aiutoIndizio);
		editor.putBoolean("aiutoImmagine", aiutoImmagine);
		editor.putBoolean("aiutoTime", aiutoTime);		
		return;
	}
	public boolean caricaStato(SharedPreferences infoStatoCaccia) {
		//considerare il caso in cui i valori non siano settati
		Boolean resume=infoStatoCaccia.getBoolean("resume", false);
		if (resume) {
			startTime=infoStatoCaccia.getLong("startTime", 0);
			lastTappaStartTime=infoStatoCaccia.getLong("lastTappaStartTime",0);
			punteggio=(double)infoStatoCaccia.getFloat("punteggio",0);
			punteggioTappa=(double)infoStatoCaccia.getFloat("punteggioTappa", 0);
			int n=infoStatoCaccia.getInt("numTappa", 0);
			stato=percorso.get(n);
			stato.indiceAiuto=infoStatoCaccia.getInt("indiceAiutoTappa", stato.indiceAiuto);
			primaPosizioneTrovata=true;
			aiutoDirezione=infoStatoCaccia.getBoolean("aiutoDirezione", false);
			aiutoDistanza=infoStatoCaccia.getBoolean("aiutoDistanza", false);
			aiutoIndizio=infoStatoCaccia.getBoolean("aiutoIndizio", false);
			aiutoImmagine=infoStatoCaccia.getBoolean("aiutoImmagine", false);
			aiutoTime=infoStatoCaccia.getBoolean("aiutoTime", false);
		}
		return resume;		
	}
	public double calcolaDistanza(Location location) {
		//calcola distanza da obiettivo
		double deltaLong=Math.abs(stato.lon-location.getLongitude());
		double deltaLat=Math.abs(stato.lat-location.getLatitude());
		double delta=(Math.sqrt(deltaLong*deltaLong+deltaLat*deltaLat));
		delta=delta*60*1852;		
		return Math.ceil(delta);
	}
	public String getDistanza(Location location) {
		String s=new String();
		s=""+calcolaDistanza(location);
		if (!aiutoDistanza){
			aiutoDistanza=true;
			if (aiutoDirezione)
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
			else
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
		}		
		return s;		
	}
	public String getDirezione(Location location) {
		String s=new String();
		s=""+calcolaDirezione(location);
		if (!aiutoDirezione){
			aiutoDirezione=true;
			if (aiutoDistanza)
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
			else
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
		}		
		return s;
	}
	private String calcolaDirezione(Location location) {
		//calcola direzione verso obiettivo
		double deltaLong=stato.lon-location.getLongitude();
		double deltaLat=stato.lat-location.getLatitude();
		int dir=(int) Math.ceil(Math.atan(deltaLong/deltaLat)*180/Math.PI);
		if (deltaLat>=0 && deltaLong<0)
			dir=360+dir;
		else if (deltaLat<0)
			dir=180+dir;
		return ""+dir;
	}
	
}
